From: Takao Fujiwara Date: Fri, 31 Aug 2018 11:22:23 +0000 (+0900) Subject: keyboard: Do not call KeyboardManager.holdKeyboard() with set-content-type X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~897^2~1^2~54 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=551e827841626cd8084daa2210b3bf60e5be96be;p=gnome-shell.git keyboard: Do not call KeyboardManager.holdKeyboard() with set-content-type When gnome-shell receives the signal of 'set-content-type' from ibus, gnome-shell calls KeyboardManager.holdKeyboard() and KeyboardManager.releaseKeyboard() and the functions change the current input focus in GNOME Xorg and it could result in closing a popup window which has a password entry by focusing on the entry. The solution is to stop to call the APIs on 'set-content-type' signal. https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 --- diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js index 6d031d88c..980019cd4 100644 --- a/js/ui/status/keyboard.js +++ b/js/ui/status/keyboard.js @@ -360,11 +360,14 @@ var InputSourceManager = new Lang.Class({ this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this)); this._sourcesPerWindowChanged(); this._disableIBus = false; + this._reloading = false; }, reload() { + this._reloading = true; this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions); this._inputSourcesChanged(); + this._reloading = false; }, _ibusReadyCallback(im, ready) { @@ -458,7 +461,15 @@ var InputSourceManager = new Lang.Class({ }, activateInputSource(is, interactive) { - KeyboardManager.holdKeyboard(); + // The focus changes during holdKeyboard/releaseKeyboard may trick + // the client into hiding UI containing the currently focused entry. + // So holdKeyboard/releaseKeyboard are not called when + // 'set-content-type' signal is received. + // E.g. Focusing on a password entry in a popup in Xorg Firefox + // will emit 'set-content-type' signal. + // https://gitlab.gnome.org/GNOME/gnome-shell/issues/391 + if (!this._reloading) + KeyboardManager.holdKeyboard(); this._keyboardManager.apply(is.xkbId); // All the "xkb:..." IBus engines simply "echo" back symbols, @@ -473,7 +484,10 @@ var InputSourceManager = new Lang.Class({ else engine = 'xkb:us::eng'; - this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + if (!this._reloading) + this._ibusManager.setEngine(engine, KeyboardManager.releaseKeyboard); + else + this._ibusManager.setEngine(engine); this._currentInputSourceChanged(is); if (interactive)